/* 
 * File:   StackTabList.h
 * Author: Gab'z
 *
 * Created on 10 juin 2012, 12:39
 */

#ifndef STACKTABLIST_H
#define	STACKTABLIST_H

#include "StackTabWidget.h"
#include "../exception/ViewException.h"
#include "../log/LogSystem.h"
#include "../model/command/literal/StackList.h"

namespace calculator {
    class Engine;

    /**
     * Classe conteneur de StackTabWidget.
     * Maintient à jour un itérateur vers le StackTabWidget actuellement affiché.
     */
    class StackTabList {
    public:

        /**
         * Constructeur de StackTabList.
         * @param engine le moteur gérant l'affichage des Stack.
         */
        StackTabList(const Engine * const engine);

        /**
         * Destructeur de StackTabList.
         * Libère la mémoire utilisée par les StackTab.
         */
        virtual ~StackTabList();

        /**
         * Getter vers le StackTabWidget désigné.
         * lance une ViewException si l'index sort de la liste.
         * index : [0 ; size() - 1].
         * @param n l'index du StackTabWidget désiré parmi la StackTabList.
         * @return le StackTabWidget désignée.
         */
        StackTabWidget* getTab(const unsigned int n) const throw (ViewException);

        /**
         * Getter vers le StackTabWidget courant.
         * @return le StackTabWidget courant de la vue (et donc du contexte)
         */
        StackTabWidget* getCurrentTab() const;

        /**
         * Setter du StackTabWidget courant.
         * lance une ViewException si l'index sort de la liste.
         * index : [0 ; size() - 1].
         * @param n index du StackTabWidget contenu dans la StackTabList.
         */
        void setCurrentTab(const unsigned int n) throw (ViewException);

        /**
         * Getter de l'index du StackTabWidget courant parmi la StackTabList.
         * @return index du StackTabWidget courant.
         */
        unsigned int getCurrentTabIndex() const;

        /**
         * Ajoute un StackTabWidget à la fin de la StackTabList.
         * Place l'itérateur de la pile courante affichée sur ce nouveau StackTabWidget
         */
        void newTab();

        /**
         * Supprime de la mémoire le StackTabWidget courant.
         * Déplace l'itérateur sur le StackTabWidget suivante si il existe, le précédent sinon.
         */
        void removeCurrentTab() throw (ViewException);

        /**
         * Duplique le StackTabWidget courant et le place après ce dernier.
         * Déplace l'itérateur du StackTabWidget courant vers le nouveau StackTabWidget.
         */
        void duplicateCurrentTab();

        /**
         * Nombre de StackTabWidget contenues dans la StackTabList
         * @return le nombre de Stack contenues dans la StackTabList
         */
        unsigned int size() const {
            return _tabList.size();
        }

    private:
        
        /**
         * Pointeur vers la StackList du Context
         */
        StackList * const _stackList;
        
        /**
         * Conteneur de StackTabWidget
         */
        std::list<StackTabWidget*> _tabList;
        
        /**
         * Itérateur vers le StackTabWidget courant
         */
        std::list<StackTabWidget*>::iterator _iteratorCurrentTab;
        
        static Logger* log;
    };
}
#endif	/* STACKTABLIST_H */

